/*
 * @Descripttion: 
 * @version: 
 * @Author: wtzhang
 * @Date: 2021-06-03 08:55:07
 * @LastEditors: wtzhang
 * @LastEditTime: 2021-06-03 11:27:04
 */
let str: string = '你好，hello-Typescript!'

let flag: boolean = true;
// flag = '123'

// 第一种定义数组
let arr: number[] = [1, 2, 3, 4] // 指定number类型
let arrstr: string[] = ['1', '2'] // 指定为 String类型
// 注意： 在指定的 类型数组里面 出现其他类型数据类型，就会报错
// 第二种定义数组方法
let arr2: Array<number> = [1, 2, 3, 4]
console.log(arr2);

// 元组类型（tuple）数组的一种
let arrTup: [string, number, boolean] = ['你好', 123, true]


// 枚举类型
enum Flag { success = 1, error = -1 }
let f: Flag = Flag.success
console.log(f);

// 官方案例：
enum Color { red, blue, orange }
let c: Color = Color.blue
console.log(c); // 1


// 任意类型 any
let foo: any = '123'
foo = 123;
foo = true;
// 有点像之前js没有定义类型的意思
// ** any类型的用处
let oBox:any = document.getElementById('box')
oBox.style.color = 'red';

// null 和 undefined

// let num: number;
// console.log(num); // 虽然会打印 undefined， 但是报错
let num: any | null | undefined;
num = '123'
num = true
console.log(num); // 正确

// void 类型
// void类型：typescript中的void表示没有任何类型，一般用于定义方法的时候方法没有返回值。
// ES5 中
// function run() {
//   console.log('running');
// }
// run()
// function run(): number {
//   console.log('running');
// } // 虽然会输出，但是报错

// ts正确写法
function run():void {
  console.log('running');
}
run()

// never 类型
// never类型：是其他类型（包括 null 和 undefined）的子类型。
// 代表从不会出现的值，这意味着声明never的变量只能被never类型所赋值。
// 比如：
let b: undefined;
// b = null; // 不好意思报错了
b = undefined; // 只能就是声明定义类型

// never
// let a: never;
// a = (() => {
//   throw new Error('错误')
// })()



// 函数的定义
let fun2 = function(): number {
  return 123
}
console.log(fun2()); // 123

// ts 定义方法传参
function getInfo(name: string, age: number) {
  return `${name}----${age}`
}
console.log(getInfo('jack', 123)) // jack----123

// 可选参数
function getInfo1(name: string, age?: number) {
  return `${name}----${age}`
}
console.log(getInfo1('jack')) // jack----undefined

// 默认参数
function getInfo2(name: string, age: number = 20) {
  return `${name}----${age}`
}
console.log(getInfo2('jack')) // jack----20

// 多参数（剩余参数）
// 常规
// function sum(a: number, b: number, c: number):number {
//   return a + b + c
// }
// console.log(sum(1, 2, 3)); // 6
function sum(...args: number[]): number {
  let [a, b, c] = [...args]
  return a + b + c
}
console.log(sum(1, 2, 3)); // 6